package cn.tedu.oopfinal;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-10 周四 19:34
 */
/*本类用于final的入门案例*/
    /**final修饰
     * 1.类 不能继承
     * 2.方法 不能重写
     * 3.成员变量 不能改变值
     * */
public class TestFinal {
    public static void main(String[] args) {
        Son son=new Son();
        son.work();
        son.workOld();//调用父类被重写的方法只能用super.XXX()
        /*final修饰的成员变量与没有final修饰的成员变量两个区别是
        final修饰的变量：
        1.不能被改变值
        2.声明是必须赋值*/
//        son.a=0;Cannot assign a value to final variable 'a'
//        son.name="222";
        System.out.println("son.a = " + son.a);//子类有则调用子类的成员变量，子类没有则调父类的
        System.out.println("son.name = " + son.name);//子类有则调用子类的成员变量，子类没有则调父类的

    }
}
/*1.final表示最终，可以用来修饰类
* 但是final修饰的类无法被继承
* 也就是没有子类，他自己就是最终类*/
//final class Father{Cannot inherit from final 'cn.tedu.oopfinal.Father'
class Father{
    public static final int a=111;
    final String name="Father name";
    /*final可以用来修饰成员变量，被final修饰的成员变量不可以被修改-常量*/
    /*注意：常量在定义的时候需要赋值，否则报错*/
//    public final void work(){//overridden method is final
    /*final可以用来修饰方法，被修饰的方法是最终实现，不能被重写*/
    public void work(){
        System.out.println("Father work");
    }
}
class Son extends Father{
    public static final int a=222;
    final String name="Son name";

//    super.work();不能写在此处


    public void work(){
        System.out.println("Son work");
    }
    public void workOld(){
        //如果想在子类中使用父类的被重写的方法，只能写一个方法调用父类被重写的方法
        super.work();
    }
}
